package it.unipg.bipod.web;

import java.util.Arrays;
import java.util.Comparator;

import it.unipg.bipod.applicationLogic.*;
import it.unipg.bipod.dataModel.*;

/**
 * DocenteBandiBean gestisce le attivita' del segretario collegate alla gestione dei bandi.<br>
 * Permette di consultare l'elenco dei bandi e memorizza un'istanza di {@link NuovoBandoBean},
 * utilizzata per creare nuovi bandi e un'istanza di {@link GestioneBandoBean} utilizzata
 * per consultare i dettagli di un singono bando e svolgere altre operazioni su di esso.<br>
 * Eventuali messaggi o errori vengono segnalati mediante i metodi forniti da DefaultBean.
 * 
 * @author Lorenzo Porzi
 * @see DefaultBean
 * @see DocenteBean
 */
public class SegretarioBandiBean extends DefaultBean {
	private SegretarioApplication application;
	
	// Bean secondari
	private GestioneBandoBean bandoCorrente; // Il bando che si sta consultando in dettaglio
	private NuovoBandoBean nuovoBando; // Il bando in corso di inserimento
	
	/**
	 * Costruisce un SegretarioBandiBean associato alla DocenteApplication fornita.
	 * 
	 * @param application la SegretarioApplication da associare a questo SegretarioBandiBean.
	 */
	public SegretarioBandiBean(SegretarioApplication application) {
		super();
		
		this.application = application;
		setBandoCorrente(null);
		setNuovoBando(null);
	}
	
	/* --------------------------------------
	 * Getters e setters per i Bean secondari
	 * -------------------------------------- */
	
	public void setBandoCorrente(GestioneBandoBean bandoCorrente) {
		this.bandoCorrente = bandoCorrente;
	}

	public GestioneBandoBean getBandoCorrente() {
		return bandoCorrente;
	}
	
	public void setNuovoBando(NuovoBandoBean nuovoBando) {
		this.nuovoBando = nuovoBando;
	}

	public NuovoBandoBean getNuovoBando() {
		return nuovoBando;
	}

	/* --------------------------------
	 * Metodi per l'estrazione dei dati
	 * -------------------------------- */
	
	/**
	 * Recupera tutti i bandi memorizzati nel database.<br>
	 * I bandi vengono ordinati per data di pubblicazione decresecente.
	 * 
	 * @return un array di {@link GestioneBandoBean} con i dati estratti.
	 */
	public GestioneBandoBean[] getBandi() {
		try {
			// Recupera i bandi e li ordina per data di pubblicazione decrescente
			Bando[] bandi = application.getBandi();
			Arrays.sort(bandi, new Comparator<Bando>() {
				public int compare(Bando b1, Bando b2) {
					return b2.getDataPubblicazione().compareTo(b1.getDataPubblicazione());
				}
			});
			
			// Incapsula i bandi nei GestioneBandoBean
			GestioneBandoBean[] bandiBean = new GestioneBandoBean[bandi.length];
			for (int i = 0; i < bandi.length; ++i)
				bandiBean[i] = new GestioneBandoBean(application, this, bandi[i]);
			
			return bandiBean;
		} catch (ApplicationException e) {
			// Ritorna un array vuoto
			GestioneBandoBean[] vuoto = {};
			return vuoto;
		}
	}
	
	/**
	 * @return il numero di bandi presenti nel database.
	 */
	public int getNumeroBandi() {
		try {
			return application.getBandi().length;
		} catch (ApplicationException e) {
			return 0;
		}
	}

	/* ---------------------
	 * Metodi di navigazione
	 * --------------------- */
	
	/**
	 * Crea un'istanza di {@link NuovoBandoBean} e l'assegna alla proprieta' nuovoBando, quindi
	 * restituisce l'indirizzo della pagina di creazione nuovo bando.
	 * 
	 * @return "/pages/segretario-bando-nuovo"
	 */
	public String creaNuovoBando() {		
		this.nuovoBando = new NuovoBandoBean(application);
		
		return "/pages/segretario-bando-nuovo";
	}
}
